#ifndef DESIGN_STRATEGY_H_
#define DESIGN_STRATEGY_H_

namespace strategy{

class FlyBehavior
{
public:
    virtual void fly() = 0;
};

class QuackBehavior
{
public:
    virtual void quack() = 0;
};

class Duck
{
public:
    void Fly(){this->m_pFly->fly();}
    void Quack(){this->m_pQuack->quack();}
protected:
    FlyBehavior*    m_pFly;
    QuackBehavior* m_pQuack;
};
///////////////////////////////////////

class FlyWithWings: public FlyBehavior
{
public:
    virtual void fly();
};

class FlyNoWay: public FlyBehavior
{
public:
    virtual void fly();
};

class TrueQuack: public QuackBehavior
{
public:
    virtual void quack();
};

class Squeak: public QuackBehavior
{
public:
    virtual void quack();
};

class MuteQuack: public QuackBehavior
{
public:
    virtual void quack();
};
///////////////////////////////////////

class MallardDuck: public Duck
{
public:
    MallardDuck();
};

class RedHeadDuck: public Duck
{
public:
    RedHeadDuck();
};

class RubberDuck: public Duck
{
public:
    RubberDuck();
};

class DecoyDuck: public Duck
{
public:
    DecoyDuck();
};

}
#endif // DESIGN_STRATEGY_H_
